package util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;

import javax.faces.context.FacesContext;

import model.Associado;
/*
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.oasis.JROdtExporter;
import net.sf.jasperreports.engine.util.JRLoader;
*/
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

@SuppressWarnings("rawtypes")
public class RelatorioUtil {

	public static final int	RELATORIO_PDF					= 1;
	public static final int	RELATORIO_EXCEL					= 2;
	public static final int	RELATORIO_HTML					= 3;
	public static final int	RELATORIO_PLANILHA_OPEN_OFFICE	= 4;
	
	private StreamedContent arquivoRetorno 	= null;
	private File 			arquivoGerado 	= null;
	private boolean 		init			= false;
	
//	@SuppressWarnings("unchecked")
	public StreamedContent geraRelatorio(List<Associado> associados, HashMap parametrosRelatorio, String nomeRelatorioJasper, 
			String nomeRelatorioSaida, int tipoRelatorio) throws UtilException {
/*		
		try {
			FacesContext context = FacesContext.getCurrentInstance();
			String caminhoRelatorio = context.getExternalContext().getRealPath("report");
			String caminhoArquivoJasper = caminhoRelatorio + File.separator + nomeRelatorioJasper + ".jasper";
			String caminhoArquivoRelatorio = null;
			
		    // Exibicao do Relatorio  
		    JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(associados);  
			JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject(caminhoArquivoJasper);
//		    JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("relatorio/nome_do_rel.jasper"));  
		  
		    JasperPrint impressoraJasper = JasperFillManager.fillReport(relatorioJasper, parametrosRelatorio, ds);  
		  			
			JRExporter tipoArquivoExportado = null;
			String extensaoArquivoExportado = "";
			
			switch (tipoRelatorio) {
				case RelatorioUtil.RELATORIO_PDF :
					tipoArquivoExportado = new JRPdfExporter();
					extensaoArquivoExportado = "pdf";
					break;
				case RelatorioUtil.RELATORIO_HTML :
					tipoArquivoExportado = new JRHtmlExporter();
					extensaoArquivoExportado = "html";
					break;
				case RelatorioUtil.RELATORIO_EXCEL :
					tipoArquivoExportado = new JRXlsExporter();
					extensaoArquivoExportado = "xls";
					break;
				case RelatorioUtil.RELATORIO_PLANILHA_OPEN_OFFICE :
					tipoArquivoExportado = new JROdtExporter();
					extensaoArquivoExportado = "ods";
					break;
				default :
					tipoArquivoExportado = new JRPdfExporter();
					extensaoArquivoExportado = "pdf";
					break;
			}
			caminhoArquivoRelatorio = caminhoRelatorio + File.separator + nomeRelatorioSaida + "." 
									+ extensaoArquivoExportado;
			arquivoGerado = new java.io.File(caminhoArquivoRelatorio);
			tipoArquivoExportado.setParameter(JRExporterParameter.JASPER_PRINT, impressoraJasper);
			tipoArquivoExportado.setParameter(JRExporterParameter.OUTPUT_FILE, arquivoGerado);
			tipoArquivoExportado.exportReport();
			arquivoGerado.deleteOnExit();
			
			InputStream conteudoRelatorio = new FileInputStream(arquivoGerado);
			arquivoRetorno = new DefaultStreamedContent(conteudoRelatorio, "application/" + extensaoArquivoExportado, 
					nomeRelatorioSaida + "." + extensaoArquivoExportado);
		} catch (JRException e) {
			throw new UtilException("Não foi possível gerar o relatório.", e);
		} catch (FileNotFoundException e) {
			throw new UtilException("Arquivo do relatório não encontrado.", e);
		}
		*/
		return arquivoRetorno;
	}
	
//	@SuppressWarnings("unchecked")
	public StreamedContent geraRelatorio(HashMap parametrosRelatorio, String nomeRelatorioJasper, 
			String nomeRelatorioSaida, int tipoRelatorio) throws UtilException {
/*		Connection conexao;
		
		try {
			conexao = this.getConexao();
		} catch(Exception e) {
			// erro ao obter a conexão com o banco
			throw new UtilException();
		}
				
		try {
			FacesContext context = FacesContext.getCurrentInstance();
			String caminhoRelatorio = context.getExternalContext().getRealPath("report");
			String caminhoArquivoJasper = caminhoRelatorio + File.separator + nomeRelatorioJasper + ".jasper";
			String caminhoArquivoRelatorio = null;
			
			//JasperReport relatorioJasper = (JasperReport) JRLoader.loadObjectFromFile(caminhoArquivoJasper);
			JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject(caminhoArquivoJasper);
			JasperPrint impressoraJasper = JasperFillManager.fillReport(relatorioJasper, parametrosRelatorio, conexao);
			JRExporter tipoArquivoExportado = null;
			String extensaoArquivoExportado = "";
			
			switch (tipoRelatorio) {
				case RelatorioUtil.RELATORIO_PDF :
					tipoArquivoExportado = new JRPdfExporter();
					extensaoArquivoExportado = "pdf";
					break;
				case RelatorioUtil.RELATORIO_HTML :
					tipoArquivoExportado = new JRHtmlExporter();
					extensaoArquivoExportado = "html";
					break;
				case RelatorioUtil.RELATORIO_EXCEL :
					tipoArquivoExportado = new JRXlsExporter();
					extensaoArquivoExportado = "xls";
					break;
				case RelatorioUtil.RELATORIO_PLANILHA_OPEN_OFFICE :
					tipoArquivoExportado = new JROdtExporter();
					extensaoArquivoExportado = "ods";
					break;
				default :
					tipoArquivoExportado = new JRPdfExporter();
					extensaoArquivoExportado = "pdf";
					break;
			}
			caminhoArquivoRelatorio = caminhoRelatorio + File.separator + nomeRelatorioSaida + "." 
									+ extensaoArquivoExportado;
			arquivoGerado = new java.io.File(caminhoArquivoRelatorio);
			tipoArquivoExportado.setParameter(JRExporterParameter.JASPER_PRINT, impressoraJasper);
			tipoArquivoExportado.setParameter(JRExporterParameter.OUTPUT_FILE, arquivoGerado);
			tipoArquivoExportado.exportReport();
			arquivoGerado.deleteOnExit();
			
			InputStream conteudoRelatorio = new FileInputStream(arquivoGerado);
			arquivoRetorno = new DefaultStreamedContent(conteudoRelatorio, "application/" + extensaoArquivoExportado, 
					nomeRelatorioSaida + "." + extensaoArquivoExportado);
		} catch (JRException e) {
			throw new UtilException("Não foi possível gerar o relatório.", e);
		} catch (FileNotFoundException e) {
			throw new UtilException("Arquivo do relatório não encontrado.", e);
		}
*/
		return arquivoRetorno;
	}
	
	private Connection getConexao() throws UtilException {
		Connection conexao = null;
		try {
			if (!init) {
				Class.forName("com.mysql.jdbc.Driver").newInstance();
				init = true;
			}
	        conexao = DriverManager.getConnection("jdbc:mysql://localhost/amtRj", "amtrj", "123");
//		java.sql.Connection conexao = null;
//			Context initContext = new InitialContext();
//			Context envContext = (Context) initContext.lookup("java:/comp/env/");
//			javax.sql.DataSource ds = (javax.sql.DataSource) envContext.lookup("jdbc/AmtRjDB");
//			conexao = (java.sql.Connection) ds.getConnection();
//			Session session = HibernateUtil.getSession();
//			conexao = session.connection();
//		} catch (HibernateException e) {
//			throw new UtilException("Ocorreu um erro de SQL.", e);
//		} catch (NamingException e) {
//			throw new UtilException("Não foi possível encontrar o nome da conexão do banco.", e);
		} catch (SQLException e) {
			throw new UtilException("Ocorreu um erro de SQL.", e);
		} catch (InstantiationException e) {
			throw new UtilException("Ocorreu um erro de Inicialização.", e);
		} catch (IllegalAccessException e) {
			throw new UtilException("Ocorreu um erro de Acesso.", e);
		} catch (ClassNotFoundException e) {
			throw new UtilException("Driver SQL não localizado na Inicialização.", e);
		}
		return conexao;
	}
}
